this.reset();
}
- _onShowMessage(_userVerifier, serviceName, message, type) {
+ _onShowMessage(_userVerifier, serviceName, message, type, showMessageResolver) {
this.setMessage(message, type);
this.emit('prompted');
- if (type === GdmUtil.MessageType.ERROR &&
- this._userVerifier.serviceIsFingerprint(serviceName)) {
- // TODO: Use Await for wiggle to be over before unfreezing the user verifier queue
- const wiggleParameters = {
- duration: 65,
- wiggleCount: 3,
- };
- this._userVerifier.increaseCurrentMessageTimeout(
- wiggleParameters.duration * (wiggleParameters.wiggleCount + 2));
- wiggle(this._message, wiggleParameters);
- }
+ const shouldWiggle = type === GdmUtil.MessageType.ERROR &&
+ this._userVerifier.serviceIsFingerprint(serviceName);
+
+ const wigglePromise = shouldWiggle
+ ? wiggle(this._message, {duration: 65, wiggleCount: 3})
+ : Promise.resolve();
+
+ showMessageResolver?.(wigglePromise);
}
_onVerificationFailed(userVerifier, serviceName, canRetry) {
this.emit('no-more-messages');
}
- increaseCurrentMessageTimeout(interval) {
- if (!this._messageQueueTimeoutId && interval > 0)
- this._currentMessageExtraInterval = interval;
- }
-
_serviceHasPendingMessages(serviceName) {
return this._messageQueue.some(m => m.serviceName === serviceName);
}
this._queuePriorityMessage(serviceName, null, messageType);
}
- _queueMessageTimeout() {
- if (this._messageQueueTimeoutId !== 0)
+ async _queueMessageTimeout() {
+ if (this._messageQueueTimeoutId !== 0 || this._showMessageResolver)
return;
const message = this.currentMessage;
+ const {promise, resolve} = Promise.withResolvers();
+ this._showMessageResolver = resolve;
- delete this._currentMessageExtraInterval;
- this.emit('show-message', message.serviceName, message.text, message.type);
+ this.emit('show-message', message.serviceName, message.text, message.type, this._showMessageResolver);
+
+ await promise.catch(logError);
+ if (!this._showMessageResolver)
+ return;
+ this._showMessageResolver = null;
this._messageQueueTimeoutId = GLib.timeout_add_once(GLib.PRIORITY_DEFAULT,
- message.interval + (this._currentMessageExtraInterval | 0), () => {
+ message.interval, () => {
this._messageQueueTimeoutId = 0;
if (this._messageQueue.length > 1) {
GLib.source_remove(this._messageQueueTimeoutId);
this._messageQueueTimeoutId = 0;
}
+
+ if (this._showMessageResolver) {
+ this._showMessageResolver();
+ this._showMessageResolver = null;
+ }
+
this.emit('show-message', null, null, MessageType.NONE);
}